package org.example.pingpong.controller;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.example.pingpong.domain.dto.AreaFormDTO;
import org.example.pingpong.domain.po.Area;
import org.example.pingpong.domain.vo.Result;
import org.example.pingpong.mapper.UserMapper;
import org.example.pingpong.service.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 场地管理接口
 */
@Api(tags = "02.场地管理接口")  // Swagger 文档标签，描述该控制器的功能
@RestController
@RequestMapping("/area")  // 控制器映射路径，所有请求以 /area 开头
public class AreaController {

    @Autowired
    private AreaService areaService;  // 注入场地服务，用于对场地进行业务处理

    @Autowired
    private UserMapper userMapper;  // 注入 UserMapper，暂时未使用，可以为后续扩展做准备

    /**
     * 添加新的场地
     *
     * @param PLACE 场地名称
     * @return 操作结果
     */
    @ApiOperation("场地添加接口")
    @PostMapping("/add")
    public Result add(@RequestParam String PLACE) {
        if(!areaService.list(new LambdaQueryWrapper<Area>().eq(Area::getPlace, PLACE)).isEmpty()) {
            return Result.fail(554, "该场地已被添加");
        };
        Area area = new Area();  // 创建新的场地对象
        area.setPlace(PLACE);     // 设置场地名称
        areaService.save(area);   // 调用服务层保存场地
        return Result.success(null);  // 返回成功的操作结果
    }

    /**
     * 删除指定场地
     *
     * @param PLACE 场地名称
     * @return 操作结果
     */
    @ApiOperation("场地删除接口")
    @DeleteMapping("/delete")
    public Result delete(@RequestParam String PLACE) {
        Area area = new Area();   // 创建一个场地对象
        area.setPlace(PLACE);      // 设置场地名称为删除条件
        Wrapper wrapper = new UpdateWrapper(area);  // 创建查询条件
        areaService.remove(wrapper);  // 调用服务层删除场地
        return Result.success(null);  // 返回成功的操作结果
    }

    /**
     * 编辑场地信息
     *
     * @param area 更新的场地信息（来自请求体）
     * @return 更新后的场地信息
     */
    @ApiOperation("场地编辑接口")
    @PutMapping("/edit")
    public Result edit(@RequestBody AreaFormDTO area) {
        if(!areaService.list(new LambdaQueryWrapper<Area>().eq(Area::getPlace, area.getPlace())).isEmpty()) {
            return Result.fail(554, "该场地已被添加");
        };
        Area old = areaService.getById(area.getId());  // 根据 ID 获取已有的场地信息
        Wrapper wrapper = new UpdateWrapper(old);  // 创建更新条件
        Area newArea = new Area();  // 新的场地对象，用于存放更新后的数据
        newArea.setPlace(area.getPlace());  // 设置新的场地名称
        areaService.update(newArea, wrapper);  // 调用服务层更新场地信息
        return Result.success(null);  // 返回成功的操作结果
    }

    /**
     * 获取场地详情
     *
     * @param ID 场地 ID
     * @return 场地的详细信息
     */
    @ApiOperation("场地详情接口")
    @GetMapping("/detail")
    public Result detail(@RequestParam Integer ID) {
        Area area = areaService.getById(ID);  // 根据 ID 获取场地信息
        return Result.success(area);  // 返回获取到的场地详情
    }

    /**
     * 获取场地列表，支持分页
     *
     * @param PAGE 当前页码
     * @param SIZE 每页显示的记录数
     * @return 场地的分页列表
     */
    @ApiOperation("获取场地列表接口")
    @GetMapping("/list")
    public Result list(@RequestParam Integer PAGE, @RequestParam Integer SIZE) {
        Page<Area> pages = areaService.page(new Page<>(PAGE, SIZE));  // 获取指定页码和大小的场地列表
        return Result.success(pages.getRecords());  // 返回场地的分页记录
    }
}
